import settings from '@/config/settings'
/**
*@config {Object} 配置项，属性值如下
*defaultCondition {Object} 查询条件对象，默认值{}
// 注意：defaultCondition
// 页面上很多地方对于查询条件对象data中定义的是一个{}，没有定义属性，模板绑定中再绑定一些属性
// 这样存在的问题是reset重置的时候如果使用{}去覆盖data中定义的查询对象时是无法清除页面上的一些查询参数的
// 使用此mixin的时候defaultCondition不应该使用默认值，使用默认值防止报错
// 必须传入完整的一个具有键值对的对象，键必须和页面v-model绑定的一一对应
*conditionObjKey {String} 查询条件对象的key值，各个组件中不同，按实际值传入, 默认值'listQuery'
*methodName {String} 获取数据的函数名，注意此函数中不应该在发出查询请求前重置查询参数、页码等，默认值'getList'
*/
export default function ({ defaultCondition = {}, conditionObjKey = 'listQuery', methodName = 'getList', tableRef = null, autoLoad = true }) {
    return {
        data() {
            return {
                defaultCondition: {} // 加这个方便在外部动态修改默认参数
            }
        },
        methods: {
            async resetConditions() {
                // 通用方法，点击页面上的重置按钮清除所有查询条件
                this[conditionObjKey] = {
                    ...this[conditionObjKey],
                    ...defaultCondition,
                    ...this.defaultCondition
                }
                this.page.pageSize = 10
                tableRef && this.$refs[tableRef].$refs.table.clearSort()
                await this.handleFilter()
            }
        },
        activated() {
            autoLoad && this[methodName]()
        },
        beforeRouteEnter(to, from, next) {
            // 路由进入前判断是不是详情页(编辑、详情)返回，如果不是，缓存组件列表去掉当前列表，当前列表就不会被缓存
            const keepAliveLists = [...window[settings.appId].keepAliveLists]
            if (!to.meta.details.includes(from.name)) {
                const currentIndex = keepAliveLists.indexOf(to.meta.componentName)
                currentIndex !== -1 && window[settings.appId].keepAliveLists.splice(currentIndex, 1)
            }
            next(vm => {
                // 进入之后重新将当前列表页面加入缓存列表
                window[settings.appId].keepAliveLists = keepAliveLists
            })
        }
    }
}

export const ResetTable = function ({ defaultCondition = {}, conditionObjKey = 'listQuery', filterName = 'handleFilter' }) {
    return {
        methods: {
            resetConditions() {
                // 通用方法，点击页面上的重置按钮清除所有查询条件
                this[conditionObjKey] = {
                    reset: true,
                    ...this[conditionObjKey],
                    ...defaultCondition
                }
                this.$emit(filterName, this[conditionObjKey])
                // reset用于重置每页数量，重置后删除，防止查询时也会重置
                delete this[conditionObjKey].reset
            }
        }
    }
}
export const ResetKeepAlive = function (methodName = 'getList') {
    return {
        beforeRouteEnter(to, from, next) {
            // 路由进入前判断是不是详情页(编辑、详情)返回，如果不是，缓存组件列表去掉当前列表，当前列表就不会被缓存
            const keepAliveLists = [...window[settings.appId].keepAliveLists]
            if (!to.meta.details.includes(from.name)) {
                const currentIndex = keepAliveLists.indexOf(to.meta.componentName)
                currentIndex !== -1 && window[settings.appId].keepAliveLists.splice(currentIndex, 1)
            }
            next(vm => {
                vm[methodName]()
                // 进入之后重新将当前列表页面加入缓存列表
                window[settings.appId].keepAliveLists = keepAliveLists
            })
        }
    }
}
